package com.ssyc.common.base;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;

import com.ssyc.common.R;

import java.util.Calendar;


/**
 * 创建日期：2017/8/17  10:42
 * 描述:懒加载Fragment的解决方案,结合ViewPager使用时需要设置ViewPager 的缓存页面个数
 * 注意要点:setUserVisibleHint这个方法仅仅工作在FragmentPagerAdapter中,不能被使用在一个普通的activity中。
 * 所以在普通的activity可以重写 onHiddenChanged() 方法来得知当前 fragment 的状态。
 * 作者:张伟
 */

public abstract class LazyBaseFragment extends CommonFragment {

    /**
     * 防止点击过快的时间间隔
     */
    public static final long NO_DOUBLE_CLICK_TIME = 500;

    /**
     * 标记已加载完成，保证懒加载只能加载一次
     */
    private boolean hasLoaded = false;
    /**
     * 标记Fragment是否已经onCreate
     */
    private boolean isCreated = false;
    /**
     * 界面对于用户是否可见
     */
    private boolean isVisibleToUser = false;
    private View view;

    /**
     * 这个方法是实现了基类的抽象方法，你可以把它当成和OnCreate()方法等价
     */
    @Override
    protected void init(View view, Bundle savedInstanceState) {
        isCreated = true;//注：关键步骤
        this.view = view;
        lazyLoad(this.view, savedInstanceState);
    }

    /**
     * 监听界面是否展示给用户，实现懒加载
     * 这个方法也是网上的一些方法用的最多的一个，我的思路也是这个，不过把整体思路完善了一下
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        this.isVisibleToUser = isVisibleToUser;//注：关键步骤
        super.setUserVisibleHint(isVisibleToUser);
        lazyLoad(view, null);
    }

    /**
     * 懒加载方法，获取数据什么的放到这边来使用，在切换到这个界面时才进行网络请求
     */
    private void lazyLoad(View view, Bundle savedInstanceState) {

        //如果该界面不对用户显示、已经加载、fragment还没有创建，
        //三种情况任意一种，不获取数据
        if (!isVisibleToUser || hasLoaded || !isCreated) {
            return;
        }
        lazyInit(view, savedInstanceState);
        hasLoaded = true;//注：关键步骤，确保数据只加载一次
    }

    /**
     * 子类必须实现的方法，这个方法里面的操作都是需要懒加载的
     */
    public abstract void lazyInit(View view, Bundle savedInstanceState);


    /**
     * 在懒加载的方法中来实现
     * 网络请求错误需要显示的页面
     */
    protected void showError() {
        statusLayoutManager.showError();
        LinearLayout ll_error_data = rootView.findViewById(R.id.ll_error_data);
        ll_error_data.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Log.i("test", "点击了错误");
                lazyInit(rootView, null);
            }
        });
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        isCreated = false;
        hasLoaded = false;
    }

    /**
     * 防止按钮重复点击的方法
     */
    protected boolean isDoubleClick(View v) {
        Object tag = v.getTag(v.getId());
        long beforeTimemiles = tag != null ? (long) tag : 0;
        long timeInMillis = Calendar.getInstance().getTimeInMillis();
        v.setTag(v.getId(), timeInMillis);
        return timeInMillis - beforeTimemiles < NO_DOUBLE_CLICK_TIME;
    }
}
